﻿using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Repositorios;
using Onshi.POS.Vendedores.Vistas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Onshi.POS.Vendedores
{
    public class VendedoresPresentador
    {
        #region Constructores

        public VendedoresPresentador(IVendedores vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IVendedores vista;
        private List<Vendedor> listado;

        #endregion

        #region Propiedades

        private RepositorioEventos RepositorioEventos
        {
            get { return new RepositorioEventos(); }
        }

        private RepositorioVendedores RepositorioVendedores
        {
            get { return new RepositorioVendedores(); }
        }

        private RepositorioUsuarios RepositorioUsuarios
        {
            get { return new RepositorioUsuarios(); }
        }

        private RepositorioRegistros RepositorioRegistros
        {
            get { return new RepositorioRegistros(); }
        }

        private RepositorioPermisos RepositorioPermisos
        {
            get { return new RepositorioPermisos(); }
        }

        private RepositorioClientes RepositorioClientes
        {
            get { return new RepositorioClientes(); }
        }

        #endregion

        #region Metodos

        private void CargarFiltrarLista()
        {
            listado = RepositorioVendedores.DevolverTodos();
            Filtrar();
        }

        public void Inicializar()
        {
            listado = RepositorioVendedores.DevolverTodos();
            vista.ListadoVendedores = listado.Where(x => !x.EstaEliminado).ToList();
        }

        public void Nuevo()
        {
            CargarFiltrarLista();
        }

        public void Modificar()
        {
            CargarFiltrarLista();
        }

        public void Eliminar()
        {
            var usuario = RepositorioUsuarios.DevolverPorId(vista.IdUsuarioSistema);
            if (usuario == null)
                throw new Exception("El usuario no existe");
            if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.VendedoresBaja))
                throw new Exception("Permisos insuficientes");

            if (vista.IdVendedor == (Int32)EnumVendedores.TitularDelComercio)
                throw new Exception("El vendedor no se permite eliminar");
            var vendedor = RepositorioVendedores.DevolverPorId(vista.IdVendedor, true);
            if (vendedor == null)
                throw new Exception("El vendedor no existe");
            if (vendedor.EstaEliminado)
                throw new Exception("El vendedor ya se encuentra eliminado");
            vendedor.EstaEliminado = true;

            var vendedorPredeterminado = RepositorioVendedores.DevolverPorId((Int32)EnumVendedores.TitularDelComercio);
            if (vendedorPredeterminado == null)
                throw new Exception("El vendedor predeterminado no existe");

            var registro = new Registro();
            registro.Usuario = usuario;
            registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.VendedoresBaja);
            if (registro.Evento == null)
                throw new Exception("El evento no existe");

            RepositorioClientes.ModificarVendedor(vendedorPredeterminado, vendedor);
            RepositorioVendedores.Modificar(vendedor);
            RepositorioRegistros.Insertar(registro, vendedor);

            CargarFiltrarLista();
        }

        public void Habilitar()
        {
            var usuario = RepositorioUsuarios.DevolverPorId(vista.IdUsuarioSistema);
            if (usuario == null)
                throw new Exception("El usuario no existe");
            if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.VendedoresHabilitacion))
                throw new Exception("Permisos insuficientes");

            if (vista.IdVendedor == (Int32)EnumVendedores.TitularDelComercio)
                throw new Exception("El vendedor no se permite habilitar");
            var vendedor = RepositorioVendedores.DevolverPorId(vista.IdVendedor, true);
            if (vendedor == null)
                throw new Exception("El vendedor no existe");
            if (!vendedor.EstaEliminado)
                throw new Exception("El vendedor ya se encuentra habilitado");
            vendedor.EstaEliminado = false;

            var registro = new Registro();
            registro.Usuario = usuario;
            registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.VendedoresHabilitacion);
            if (registro.Evento == null)
                throw new Exception("El evento no existe");

            RepositorioVendedores.Modificar(vendedor);
            RepositorioRegistros.Insertar(registro, vendedor);

            CargarFiltrarLista();
        }

        public void Actualizar()
        {
            CargarFiltrarLista();
        }

        public void Filtrar()
        {
            var consulta = (from item in listado
                            where item.Nombre.Trim().ToLower().Contains(vista.NombreFiltro.Trim().ToLower())
                            & item.TieneObservaciones == (vista.ObservacionesFiltro == EnumSiNo.Todos ? item.TieneObservaciones : (vista.ObservacionesFiltro == EnumSiNo.Si ? true : false))
                            & item.TieneImagen == (vista.ImagenFiltro == EnumSiNo.Todos ? item.TieneImagen : (vista.ImagenFiltro == EnumSiNo.Si ? true : false))
                            & item.Codigo.Trim().ToLower().Contains(vista.CodigoFiltro.Trim().ToLower())
                            & item.SitioWeb.Trim().ToLower().Contains(vista.SitioWebFiltro.Trim().ToLower())
                            & item.Email.Trim().ToLower().Contains(vista.EmailFiltro.Trim().ToLower())
                            & item.EstaEliminado == (vista.EstadoFiltro == EnumActivoInactivo.Todos ? item.EstaEliminado : (vista.EstadoFiltro == EnumActivoInactivo.Inactivo ? true : false))
                            & (item.Comision >= vista.ComisionDesdeFiltro & item.Comision <= vista.ComisionHastaFiltro)
                            & (item.ComisionMaxima >= vista.ComisionMaximaDesdeFiltro & item.ComisionMaxima <= vista.ComisionMaximaHastaFiltro)
                            & item.Rubro.Id == (vista.IdRubroVendedorFiltro == (Int32)EnumRubrosVendedores.Todos ? item.Rubro.Id : vista.IdRubroVendedorFiltro)
                            & item.TipoComision.Id == (vista.IdTipoComisionVendedorFiltro == (Byte)EnumTiposComisionesVendedores.Todos ? item.TipoComision.Id : vista.IdTipoComisionVendedorFiltro)
                            select item).ToList();

            var consultaDomicilios = new List<Vendedor>();
            if (!String.IsNullOrWhiteSpace(vista.DomicilioFiltro))
            {
                foreach (var vendedor in consulta)
                    if (vendedor.Domicilios.Count == 0)
                        consultaDomicilios.Add(vendedor);
                    else
                        if (vendedor.Domicilios.Where(x => x.DomicilioCompleto.Trim().ToLower().Contains(vista.DomicilioFiltro)).Count() != 0)
                            consultaDomicilios.Add(vendedor);
            }
            else
                consultaDomicilios.AddRange(consulta);

            var consultaTelefonos = new List<Vendedor>();
            if (!String.IsNullOrWhiteSpace(vista.TelefonoFiltro))
            {
                foreach (var vendedor in consultaDomicilios)
                    if (vendedor.Telefonos.Count == 0)
                        consultaTelefonos.Add(vendedor);
                    else
                        if (vendedor.Telefonos.Where(x => x.TelefonoCompleto.Trim().ToLower().Contains(vista.TelefonoFiltro)).Count() != 0)
                            consultaTelefonos.Add(vendedor);
            }
            else
                consultaTelefonos.AddRange(consultaDomicilios);


            var consultaBarrios = new List<Vendedor>();
            foreach (var vendedor in consultaTelefonos)
                if (vendedor.Domicilios.Count == 0)
                    consultaBarrios.Add(vendedor);
                else
                    foreach (var domicilio in vendedor.Domicilios)
                        if (vista.IdBarriosFiltros.Contains(domicilio.Barrio.Id))
                        {
                            consultaBarrios.Add(vendedor);
                            break;
                        }

            var consultaCamposPersonalizados = new List<Vendedor>();
            if (!String.IsNullOrWhiteSpace(vista.CampoPersonalizadoFiltro))
            {
                foreach (var vendedor in consultaBarrios)
                    if (vendedor.CamposPersonalizados.Count == 0)
                        consultaCamposPersonalizados.Add(vendedor);
                    else
                        if (vendedor.CamposPersonalizados.Where(x => x.Valor.Trim().ToLower().Contains(vista.CampoPersonalizadoFiltro)).Count() != 0)
                            consultaCamposPersonalizados.Add(vendedor);
            }
            else
                consultaCamposPersonalizados.AddRange(consultaBarrios);

            vista.ListadoVendedores = consultaCamposPersonalizados;
        }

        #endregion
    }
}
